/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sn.service;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import sn.dao.FichierDAO;
import sn.dao.PartageDAO;
import sn.dao.PersonneDAO;
import sn.metier.Fichier;
import sn.metier.Partage;
import sn.metier.Personne;

/**
 *
 * @author Harry
 */
@Component
public class PartageServiceImpl implements PartageService{

    @Autowired
    private PartageDAO partageDAO;    
    @Autowired
    private PersonneDAO personneDAO;
    @Autowired
    private FichierDAO fichierDAO;
    
    private String STORE_DIRECTORY = "sn_luce_henry";
    public String STORE_ABSOLUTE = System.getProperty("user.home") + File.separator + "."+STORE_DIRECTORY + File.separator;

    @Override
    public List<Partage> voirMur(Long id, Long idUtil) {
        Personne pers = personneDAO.findById(id);
        List<Partage> l = partageDAO.findByAuteur(idUtil);
        List<Partage> result = new ArrayList<Partage>();

        for(Partage p : l){
            if(p.getDestinataire().contains(p.getAuteur()) || p.getDestinataire().contains(pers)){
                result.add(p);
            }
        }
        return result;
    }

    @Override
    public List<Partage> voirMurPerso(Long id){
        Personne pers = personneDAO.findById(id);
        List<Partage> result = new ArrayList<Partage>();

        for(Personne ami : pers.getAmis()){
            result.addAll(this.voirMur(id, ami.getId()));
        }
        result.addAll(partageDAO.findByAuteur(id));
        Collections.sort(result);
        return result;
    }

    @Override
    public Partage partagerFichierPublic(Long idpers, String message, String nomOriginalFichier, String nomFichier, String typeFichier, Long tailleFichier) {
        Personne pers = personneDAO.findById(idpers);
        List<Personne> dest = new ArrayList();
        dest.add(pers);
        if(nomFichier==null){
            Partage f = new Partage(message, pers, dest);
            return partageDAO.save(f);
        }
        Partage f = new Fichier(nomOriginalFichier,nomFichier, typeFichier, tailleFichier,message, pers, dest);    
        return partageDAO.save(f);
    }
/*
    @Override
    public Partage partagerFichierPrive(Long idpers, String message, Long iddest, String nomFichier, String typeFichier, Integer tailleFichier) {
        Personne pers = personneDAO.findById(idpers);
        List<Personne> dest = new ArrayList();
        dest.add(personneDAO.findById(iddest));
        if(nomFichier==null){
            Partage f = new Partage(Visibilite.DESTINATAIRE, message, pers, dest);
            return f;
        }
        Partage f = new Fichier(nomFichier, typeFichier, tailleFichier, Visibilite.DESTINATAIRE, message, pers, dest);                
        return f;
    }*/

    @Override
    public Partage partagerFichierAmis(Long idpers, String message, List<Long> liste, String nomOriginalFichier, String nomFichier, String typeFichier, Long tailleFichier) {
        Personne pers = personneDAO.findById(idpers);
        if(liste.contains(idpers)){
            return this.partagerFichierPublic(idpers, message,nomOriginalFichier, nomFichier, typeFichier, tailleFichier);
        }
        List<Personne> lp = personneDAO.findByIds(liste);
        
        if(nomFichier==null){
            Partage f = new Partage(message, pers, lp);
            return partageDAO.save(f);
        }
        Partage f = new Fichier(nomOriginalFichier,nomFichier, typeFichier, tailleFichier, message, pers, lp);
        
        return partageDAO.save(f);
    }

    @Override
    public File sauvegardeFichier(InputStream is) {
        File dir = new File(STORE_ABSOLUTE);
        dir.mkdirs();
        boolean created = dir.mkdirs();
        if(!created && !dir.exists()){
            throw new RuntimeException("Le répertoire de stockage n'a pu être créé :"+ STORE_ABSOLUTE);
        }
        try {
            File file = new File(dir,UUID.randomUUID().toString());
            file.createNewFile();
            OutputStream fo;

            fo = new BufferedOutputStream(new FileOutputStream(file));
            for(int c = is.read(); c != -1; c = is.read()) {
                fo.write(c);
            }          
            fo.close();
            is.close();

            return file;
        } catch (IOException ex) {
            Logger.getLogger(PartageServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public InputStream chargerFluxFichier(Long id) {
        Fichier f = fichierDAO.findById(id);
        String name = f.getNom();
        File file = new File(STORE_ABSOLUTE + name);
        if(!file.exists() || !file.canRead()) {
            throw new RuntimeException("Le fichier demandé "+name+" ne peut pas être lu.");
        }
        try {
            return new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(PartageServiceImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public Fichier chargerFichier(Long id) {
        Fichier f = fichierDAO.findById(id);
        return f;
    }

    @Override
    public void supprimerPartage(Long idUtilisateur, Long idPartage) {
        Partage poste = partageDAO.findById(idPartage);

        if(poste.getAuteur().getId().equals(idUtilisateur)){
            partageDAO.delete(poste);
        }
    }
}
